4.7 IPv6
Para responder a la necesidad de un espacio de direcciones IP más grande, se desarrolló un nuevo protocolo IP, el protocolo IPv6. Una motivación adicional fue hacer un formato del cabezal que ayude a acelerar el procesamiento/forwarding del paquete.
Formato del datagrama IPv6: cabezal de largo fijo de 40 bytes y no se permite fragmentación.
La notación utilizada por IPv6 codifica las agrupaciones de 16 bits en su representación hexadecimal y separa parejas de éstos con el carácter “:” eliminando ceros a la izquierda dentro de dichas parejas, así como bloques completos de ceros representados por “::”. En total quedan 8 agrupaciones de 16 bits.
En la lista siguiente se describe la función de cada campo de encabezado.
Varios campos que aparecían en IPv4 ya no aparecen en IPv6, como, por ejemplo:
No se puede hacer una actualización de todos los routers simultáneamente, o sea hacer un “dia D”.
La forma más directa es la pila dual (dual stack), donde todos los nodos de la red tengan una implementación para IPV4 e IPV6.
Otra opción es la tunelización, consiste en tomar el datagrama IPv6 completo como el campo de datos de un datagrama IPv4, el cual se envía normalmente por una red IPv4, permitiendo recuperar el datagrama IPv6 original en el receptor. El concepto se puede aplicar a múltiples protocolos “tunelizados” por otros.
Una última opción sería que se haga traducción entre IPv6 y IPv4 cuando sea necesario.
IPv6 puede ser agregado a cualquier dispositivo que hable IPv4.
Los protocolos son multiplexados y de-multiplexados sobre los mismos enlaces (i.e. IEEE 802 family) utilizando diferentes números de protocolo en una misma posición del frame.
Misma técnica a la utilizada para mezclar IPX, Appletalk, TCP, etc.
Es un problema de la aplicación elegir cuál protocolo utilizar (i.e. si una respuesta a una consulta DNS contiene registros AAAA, entonces preferir TCP sobre IPv6 como transporte).
Esto habilita una transición paulatina, permitiendo a los desarrolladores actualizar gradualmente sus aplicaciones.
Lenguajes como Java permiten la utilización de objetos de tipo InetAddress, generalizaciones de Inet4Address e Inet6Address, haciendo su manejo independiente del protocolo.
Utilizamos el tunneling para “ocultar” tráfico IPv6 dentro de tráfico IPv4. De esta forma podemos cruzar secciones de Internet que nos son IPv6 Ready aún.
Los paquetes IPv6 se encapsulan en paquetes IPv4, que pueden tratarse como tráfico IPv4 standard.
Conceptualmente, puede pensarse como:
Hay distintas formas de poner IPv6 en IPv4:
El concepto se puede aplicar a múltiples protocolos “tunelizados” por otros. El mecanismo más simple es el descripto, normalmente denominado 6in4; el mecanismo 6to4 es similar pero permite usar servidores de pasarela o relays. Entre otras posibilidades, se puede implementar la tunelización con transporte UDP, denominado Teredo; en este caso se facilita la tunelización a través de un router NAT.
El protocolo que utiliza IPv6 para control en general es ICMPv6. El subprotocolo que se encarga del conocimiento, administración y gestión de vecinos en el enlace es el Neighboor Discovery Protocol, ND.
Los mensajes que se utilizan para descubrir y anunciar las direcciones MAC de un vecino asociadas a cierta dirección IPv6 son Neighbor Solicitation y Neighbor Advertisement. Cuando un host desea conocer la direccion MAC asociada a un vecino HOST-A envía un mensaje ND, con destino IPv6 la dirección de multicast asociada a todos los hosts (ff02::1) y con dirección de destino a nivel mac, la asociada a dicho grupo de multicast (que no es broadcast). En el payload de ICMPv6, el mensaje ND contiene la dirección objetivo de la consulta. La eventual respuesta (si existe y es alcanzable en ese momento el destino) será enviado en un mensaje de tipo unicast con las direcciones origen y destino esperadas a nivel de cabezales MAC e IPv6. En el payload ICMPv6 viene la respuesta a la consulta donde se indica la dirección MAC solicitada.
Reemplaza los mensajes “ARP request” de IPv4 (transportados en tramas de broadcast ethernet), brindando características mejoradas y teniendo mejor integración con la suite IPv6. ND forma parte de los mecanismos de base de IPv6, mientras que en IPv4 se utilizan diferentes mecanismos para alcanzar funcionalidades similares: ARP, ICMP router discovery, e ICMP redirect.
Los routers no realizan fragmentación en IPv6, por lo que, si un PDU de IPv6 excede el MTU es descartado. Es importante para cualquier par de entidades que se comuniquen, asegurarse que sus mensajes lleguen a destino, y para ello, sus mensajes no deben exceder el mínimo MTU del camino por el que transitan.
Esto no es necesario en IPv4. La definición de IPv4 involucra que, cuando segmentos de determinado flujo arriban a un enlace con un MTU inferior, se realiza fragmentación y reensamblado en dicho enlace, sin que las entidades origen y destino de la comunicación eventualmente lleguen a enterarse. Los extremos de la comunicación pueden ignorar el mínimo MTU del camino, pues, los routers intermedios lo resuelven.
Pseudocódigo del algoritmo por bipartición. Asumo que dispongo de una función para el envío de un mensaje ICMP echo request.
int pathMTUDiscovery(IPv6_address IP_O, IP_D)
int max_mtu = link.getMTU(); // el valor máximo lo define el enlace
int min_mtu= 1280; //según RFC 2460
int cant_fallos=0;
while ((max_mtu – min_mtu)>1)
mtu_candidato = (max_mtu + min_mtu) / 2;
envio_ICMP_ER(IP_O,IP_D,mtu_candidato);
switch event:
timeout: //no se lo que pasó: hubo retardo o se perdió el mensaje
if (cant_fallos < MAX_FALLOS_ADMITIDOS)
cant_fallos++;
else
return 1280; // no pude determinar el MTU, pero
// devuelvo un MTU válido
ICMP_echo_reply: // mtu_candidato es un MTU válido
min_mtu = mtu_candidato;
ICMP_packet_too_big: //mtu_candidato excede el pathMTU
max_mtu = mtu_candidato;
end; //while
return min_mtu;